#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include "idc_ubus_beidou.h"
#include "beidou_service.h"
#include "crc.h"
// 生成 NMEA 校验和
void generate_checksum(const char *data, char *checksum_str) {
    uint8_t checksum = 0;
    for (int i = 0; data[i] != '\0'; i++) {
        checksum ^= data[i];
    }
    snprintf(checksum_str, 3, "%02X", checksum); // 转换为16进制字符串
}

int location(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg){
        blob_buf_init(&b, 0);

        char time[20], longitude[20], latitude[20], hdop[20], altitude[20];
        sprintf(time, "%02d:%02d:%02d.%03d",
                  BD_Location.datetime.hour, BD_Location.datetime.min,
                  BD_Location.datetime.sec, BD_Location.datetime.msec);
        sprintf(latitude, "%.6f", BD_Location.position.latitude);
        sprintf(longitude, "%.6f", BD_Location.position.longitude);
        sprintf(hdop, "%.1f", BD_Location.position.hdop);
        sprintf(altitude, "%.1f", BD_Location.position.altitude);

        blobmsg_add_string(&b, "time", time);
        blobmsg_add_string(&b, "latitude", latitude);
        blobmsg_add_string(&b, "longitude", longitude);
        blobmsg_add_string(&b, "hdop", hdop);
        blobmsg_add_string(&b, "altitude", altitude);
        blobmsg_add_u32(&b, "fix_quality", BD_Location.position.fix_quality);
        blobmsg_add_u32(&b, "satellites", BD_Location.position.satellites);
        ubus_send_reply(ctx, req, b.head);
}
/**
 * 命令格式：$PCAS03,<GNGGA>,<GNGLL>,<GPGSA/BDGSA>,<GPGSV/BDGSV>,<GNRMC>,<GNVTG>,<GNZDA>,<GPTXT>,<>*<Checksum><CR><LF>
 * ​GNGGA​ - Global Navigation Satellite System Fix Data（全球导航卫星系统定位数据）提供基本的定位信息，包括时间、纬度、经度、定位质量指示、使用的卫星数量、水平精度因子、海拔高度、大地水准面高度差和差分GPS数据年龄等。
 * ​GNGLL​ - Geographic Position, Latitude/Longitude（地理定位，纬度/经度）提供当前的纬度、经度、UTC时间和定位状态。
 * ​GPGSA/BDGSA​ - GPS/BeiDou DOP and Active Satellites（GPS/北斗DOP值和活动卫星）提供DOP（精度因子）值和活动卫星的PRN（伪随机噪声）码。包括模式（自动/手动）、定位类型（2D/3D）、PDOP（位置精度因子）、HDOP（水平精度因子）、VDOP（垂直精度因子）以及正在用于定位的卫星列表（最多12颗）。
 * ​GPGSV/BDGSV​ - GPS/BeiDou Satellites in View（GPS/北斗可见卫星信息）提供可见卫星的信息，包括卫星PRN号、仰角、方位角、信噪比（SNR）等。一条GSV语句最多包含4颗卫星的信息，因此如果有更多卫星，会分成多条语句。
 * ​GNRMC​ - Recommended Minimum Specific GNSS Data（推荐最小定位信息）提供推荐的最小定位信息，包括时间、定位状态、纬度、经度、地面速率（节）、地面航向（度）、日期、磁偏角和模式指示（A=自动，D=差分，E=估算，N=无效）。
 * ​GNVTG​ - Track Made Good and Ground Speed（地面速度信息）提供地面速度和航向信息。包括真航向、磁航向、地面速率（节、公里/小时等）。
 * ​GNZDA​ - Time and Date（时间和日期）提供UTC时间和日期（日、月、年）以及本地时区偏移。
 * ​GPTXT​ - Text Transmission（文本传输）用于传输文本信息，通常用于传输设备状态、错误消息或其他文本信息。
 * 例：PCAS03,9,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0
 * 
 * 输出频率​：$PCAS03,<freq>*<checksum>
 * NMEA语句​：$PCAS04,<GGA>,<GLL>,<GSA>,<GSV>,<RMC>,<VTG>,<ZDA>,<ANT>,<DHV>,<LPS>*<checksum>
 * 定位模式​：$PCAS11,<mode>*<checksum> // mode: 1=GPS, 2=北斗, 3=双模
 * 波特率​：$PCAS05,<baudrate>*<checksum>
 * 
 */
int cmd_ctl(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg){
        struct blob_attr *tb[1];
        blobmsg_parse(beidou_cmd_ctl_policy, 2, tb, blob_data(msg), blob_len(msg));
        if (tb[0]) {
                const char *cmd = blobmsg_get_string(tb[0]);
                char checksum[3] = {0};
                generate_checksum(cmd, checksum);
                beidou_printf("$%s*%s\r\n", cmd, checksum);
        }
}
/**
 * 保存设置​：$PCAS00*37
 */
int save_cfg(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg){
        beidou_printf("$PCAS00*37\r\n");
}
